using Dew.Math;
using Dew.Math.Units;
using Dew.Signal;
using Dew.Signal.Units;
using Dew.Math.Tee;
using Dew.Math.Editors;
using Dew.Signal.Tee;
private void button1_Click(
object sender, EventArgs e)
{
Vector h =
MtxExpr.Sin(
MtxExpr.Ramp(256, TMtxFloatPrecision.mvDouble, 0, 2 *
Math387.PI * 6/256));
Vector Re =
new Vector(0);
Vector Im =
new Vector(0);
Vector h1 =
new Vector(0);
SignalUtils.Hilbert(h);
h.CplxToReal(Re, Im);
MtxVecTee.DrawIt(
new TVec[2] {Re,Im},
new string[2] {"Real","Imag"} ,"Integer frequency",
false);
h1.SetIt(
false,
new double[1] {Re.DotProd(Im)});
MtxVecEdit.ViewValues(h1,"Dot product between Re and Im",
true);
h =
MtxExpr.Sin(
MtxExpr.Ramp(256, TMtxFloatPrecision.mvDouble,0, 2 *
Math387.PI * 6.5/256));
SignalUtils.Hilbert(h);
h.CplxToReal(Re, Im);
MtxVecTee.DrawIt(
new TVec[2] {Re,Im},
new string[2] {"Real","Imag"} ,"Non-integer frequency",
false);
h1.SetIt(
false,
new double[1] {Re.DotProd(Im)});
MtxVecEdit.ViewValues(h1,"Dot product between Re and Im",
true);
h =
MtxExpr.Sin(
MtxExpr.Ramp(256, TMtxFloatPrecision.mvDouble, 0, 2 *
Math387.PI * 6.5/256));
Re.Copy(h);
Im.Copy(h);
SignalUtils.KaiserImpulse(h1,
new double[2] {0.95,1}, 0.01, TFilterType.ftHilbertIII,1,2,
true);
//Or use remez: OptimalFIR.RemezImpulse(h1,new double[2] {0.05,0.95}, 0.01, TFilterType.ftHilbertIII);
SignalUtils.FirFilter(Im,h1,1,1);
//also compensates for integer filter delay (if filter is Odd length (type III))
MtxVecTee.DrawIt(
new TVec[2] {Re,Im},
new string[2] {"Real","Imag"} ,"With FIR Filter",
false);
h1.SetIt(
false,
new double[1] {Re.DotProd(Im)});
//dot product between Re and Im should be zero
MtxVecEdit.ViewValues(h1, "Dot product between Re and Im",
true);
}